package com.fzg.common.demo.songsings;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fzg.common.tool.HttpUtils;
import com.fzg.common.tool.JSONUtilsTool;
import com.fzg.entity.Gedan;
import com.fzg.mapper.GedanMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Map;

/**
 * create by fzg
 * 2022/12/2 17:03
 * 从网易云音乐api中获取歌单
 */

@Slf4j
public class ListSong {

    @Autowired
    private GedanMapper gedanMapper;

    /**
     * 获取歌单列表
     * api接口地址：https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=neteasecloudmusicapi
     * 项目地址：https://github.com/Binaryify/NeteaseCloudMusicApi
     * 下载下来之后
     * npm install
     * 运行 node app.js
     * 默认运行端口：3000
     */
    public void getListSongs(){
        // 推荐歌单的请求地址：http://localhost:3000/personalized?limit=
        /*
          推荐歌单
          说明 : 调用此接口 , 可获取推荐歌单

          可选参数 : limit: 取出数量 , 默认为 30 (不支持 offset)

          接口地址 : /personalized

          调用例子 : /personalized?limit=1
         */
        // 获取100个歌单
        String url = "http://localhost:3000/personalized?limit=50";
        String s = HttpUtils.sendGetRequest(url);
        log.info(s);
        // JSON字符串转JSONObject对象
        JSONObject jsonObj = JSONObject.parseObject(s);
        // JSONObject对象转map
        Map<String, Object> map = JSONUtilsTool.JSONObjectToMap(jsonObj);
        log.info(map.toString());

        log.info(map.get("code").toString());
        if (map.get("code").toString().equals("200")){
            // 200 说明获取数据成功
            Object result = map.get("result");
            log.info(result.toString());
            // 获取到了歌单列表
            JSONArray resuArr = JSONObject.parseArray(result.toString());
            log.info(resuArr.get(0).toString());

            // JSONArray 转 list<javaBean>
            List<Gedan> gedanList = resuArr.toJavaList(Gedan.class);
            log.info(gedanList.size() + "张歌单");

            // 把歌单信息存入数据库
            for (Gedan gedan : gedanList) {
                List<Gedan> gedans = gedanMapper.selectList(new LambdaQueryWrapper<Gedan>()
                        .eq(Gedan::getId, gedan.getId())
                );
                if (gedans.size() > 0){
                    for (Gedan gedan1 : gedans) {
                        gedan1.setName(gedan.getName());
                        gedan1.setPicUrl(gedan.getPicUrl());
                        gedan1.setPlayCount(gedan.getPlayCount());
                        gedanMapper.updateById(gedan1);
                    }
                }else {
                    gedanMapper.insert(gedan);
                }
            }
            log.info("歌单数据保存数据库成功");
        }else {
            log.info("数据获取失败");
        }

    }

}
